package serial

import (
	"fmt"
	"time"

	"gitee.com/rw555/fdsmastergo/pkg/keypad"
	"gitee.com/rw555/fdsmastergo/pkg/logger"
	"go.uber.org/zap"
)

// Example 串口设备使用示例
func Example() error {
	// 1. 创建配置
	config := NewDefaultConfig()
	config.Port = "/dev/ttyACM0" // 根据实际情况修改
	config.BaudRate = 115200
	config.EnableDebugLog = true

	logger.SystemInfo("开始串口设备示例", zap.String("port", config.Port))

	// 2. 创建串口设备
	device, err := NewSerialDevice(config)
	if err != nil {
		return fmt.Errorf("创建串口设备失败: %w", err)
	}

	// 3. 设置事件回调
	device.SetKeyEventCallback(func(event KeypadEvent) {
		logger.SystemInfo("收到按键事件",
			zap.String("key", event.Key.String()),
			zap.String("type", event.Type.String()),
			zap.Time("timestamp", event.Timestamp))
	})

	device.SetBLEEventCallback(func(results BLEScanResults) {
		logger.SystemInfo("收到BLE扫描结果",
			zap.Int64("timestamp", results.Timestamp),
			zap.Int("deviceCount", len(results.Devices)))

		for _, dev := range results.Devices {
			logger.SystemDebug("BLE设备",
				zap.String("mac", dev.MAC),
				zap.String("name", dev.Name),
				zap.Int("rssi", dev.RSSI))
		}
	})

	device.SetStatusChangeCallback(func(key string, value interface{}) {
		logger.SystemInfo("设备状态变化",
			zap.String("key", key),
			zap.Any("value", value))
	})

	// 4. 连接设备
	if err := device.Connect(); err != nil {
		return fmt.Errorf("连接设备失败: %w", err)
	}
	defer device.Disconnect()

	logger.SystemInfo("设备连接成功，开始测试...")

	// 5. 等待设备就绪
	for i := 0; i < 10; i++ {
		if device.IsReady() {
			break
		}
		time.Sleep(time.Second)
		logger.SystemInfo("等待设备就绪...", zap.Int("attempt", i+1))
	}

	if !device.IsReady() {
		return fmt.Errorf("设备未就绪")
	}

	// 6. 测试设备功能
	if err := testDeviceFunctions(device); err != nil {
		logger.SystemError("设备功能测试失败", zap.Error(err))
		return err
	}

	// 7. 测试BLE功能
	if err := testBLEFunctions(device); err != nil {
		logger.SystemError("BLE功能测试失败", zap.Error(err))
		return err
	}

	// 8. 监听事件
	logger.SystemInfo("开始监听事件，按Ctrl+C停止...")
	select {}
}

// testDeviceFunctions 测试设备基本功能
func testDeviceFunctions(device *SerialDevice) error {
	logger.SystemInfo("开始测试设备基本功能...")

	// 测试水泵控制
	logger.SystemInfo("测试水泵控制...")
	if err := device.OpenPump(); err != nil {
		return fmt.Errorf("开启水泵失败: %w", err)
	}

	time.Sleep(2 * time.Second)

	running, err := device.PumpIsRunning()
	if err != nil {
		return fmt.Errorf("检查水泵状态失败: %w", err)
	}
	logger.SystemInfo("水泵状态", zap.Bool("running", running))

	// 设置水泵功率
	if err := device.SetPumpPower(50); err != nil {
		return fmt.Errorf("设置水泵功率失败: %w", err)
	}

	power, err := device.GetPumpPower()
	if err != nil {
		return fmt.Errorf("获取水泵功率失败: %w", err)
	}
	logger.SystemInfo("水泵功率", zap.Int("power", power))

	time.Sleep(2 * time.Second)

	if err := device.ClosePump(); err != nil {
		return fmt.Errorf("关闭水泵失败: %w", err)
	}

	// 测试加热器控制
	logger.SystemInfo("测试加热器控制...")
	if err := device.OpenHeater1(); err != nil {
		return fmt.Errorf("开启加热器1失败: %w", err)
	}

	time.Sleep(2 * time.Second)

	heater1Open, err := device.IsHeater1Open()
	if err != nil {
		return fmt.Errorf("检查加热器1状态失败: %w", err)
	}
	logger.SystemInfo("加热器1状态", zap.Bool("open", heater1Open))

	if err := device.CloseHeater1(); err != nil {
		return fmt.Errorf("关闭加热器1失败: %w", err)
	}

	// 测试温度读取
	temp, err := device.GetTemp()
	if err != nil {
		return fmt.Errorf("读取温度失败: %w", err)
	}
	logger.SystemInfo("当前温度", zap.Int("temperature", temp))

	logger.SystemInfo("设备基本功能测试完成")
	return nil
}

// testBLEFunctions 测试BLE功能
func testBLEFunctions(device *SerialDevice) error {
	logger.SystemInfo("开始测试BLE功能...")

	// 启动BLE扫描
	if err := device.SetBLEScanning(true, ""); err != nil {
		return fmt.Errorf("启动BLE扫描失败: %w", err)
	}

	logger.SystemInfo("BLE扫描已启动，等待5秒...")
	time.Sleep(5 * time.Second)

	// 启动带过滤的BLE扫描
	if err := device.SetBLEScanning(true, "HeartRate"); err != nil {
		return fmt.Errorf("启动过滤BLE扫描失败: %w", err)
	}

	logger.SystemInfo("带过滤的BLE扫描已启动，等待5秒...")
	time.Sleep(5 * time.Second)

	// 停止BLE扫描
	if err := device.SetBLEScanning(false, ""); err != nil {
		return fmt.Errorf("停止BLE扫描失败: %w", err)
	}

	logger.SystemInfo("BLE功能测试完成")
	return nil
}

// ExampleBasicUsage 基本使用示例
func ExampleBasicUsage() {
	// 创建默认配置
	config := NewDefaultConfig()
	config.Port = "/dev/ttyACM0"

	// 创建设备
	device, err := NewSerialDevice(config)
	if err != nil {
		logger.SystemError("创建设备失败", zap.Error(err))
		return
	}

	// 连接设备
	if err := device.Connect(); err != nil {
		logger.SystemError("连接设备失败", zap.Error(err))
		return
	}
	defer device.Disconnect()

	// 控制水泵
	if err := device.OpenPump(); err != nil {
		logger.SystemError("开启水泵失败", zap.Error(err))
		return
	}

	// 设置功率
	if err := device.SetPumpPower(75); err != nil {
		logger.SystemError("设置水泵功率失败", zap.Error(err))
		return
	}

	// 等待一段时间
	time.Sleep(5 * time.Second)

	// 关闭水泵
	if err := device.ClosePump(); err != nil {
		logger.SystemError("关闭水泵失败", zap.Error(err))
		return
	}

	logger.SystemInfo("基本使用示例完成")
}

// ExampleEventHandling 事件处理示例
func ExampleEventHandling() {
	config := NewDefaultConfig()
	config.Port = "/dev/ttyACM0"

	device, err := NewSerialDevice(config)
	if err != nil {
		logger.SystemError("创建设备失败", zap.Error(err))
		return
	}

	// 设置按键事件处理
	device.SetKeyEventCallback(func(event KeypadEvent) {
		switch event.Type {
		case KeypadEventTypePress:
			logger.SystemInfo("按键按下", zap.String("key", event.Key.String()))

			// 根据不同按键执行不同操作
			switch event.Key {
			case keypad.KeyF1:
				device.OpenPump()
			case keypad.KeyF2:
				device.ClosePump()
			case keypad.KeyF3:
				device.OpenHeater1()
			case keypad.KeyMenu:
				device.CloseHeater1()
			}

		case KeypadEventTypeRelease:
			logger.SystemInfo("按键释放", zap.String("key", event.Key.String()))
		}
	})

	// 设置BLE事件处理
	device.SetBLEEventCallback(func(results BLEScanResults) {
		logger.SystemInfo("发现BLE设备", zap.Int("count", len(results.Devices)))
		// 处理扫描结果...
	})

	// 设置状态变化处理
	device.SetStatusChangeCallback(func(key string, value interface{}) {
		logger.SystemInfo("状态变化", zap.String("key", key), zap.Any("value", value))
	})

	// 连接并启动BLE扫描
	if err := device.Connect(); err != nil {
		logger.SystemError("连接设备失败", zap.Error(err))
		return
	}
	defer device.Disconnect()

	// 启动BLE扫描
	device.SetBLEScanning(true, "")

	// 持续监听事件
	logger.SystemInfo("开始监听事件...")
	select {}
}
